Ce site contient essentiellement des notes de travail. Le contenu est en constante évolution, et loin d'être achevé. (+ d'infos)
La plupart des documentations informatiques sont orientées Debian / Ubuntu.

Informatique/Softwares/LinuxCNC/Recettes/Relais sur un arduino

De Ordinoscope.net.

Sommaire

[masquer]

Introduction

L'idée est de contrôler au moins 2 relais depuis EMC2 via un Arduino, l'un pour activer l'alimentation de la machine, et l'autre pour la fraiseuse.

Ce n'est pas difficile de concevoir un tel circuit, mais ça demande quelques heures pour comprendre la HAL de EMC2. Cet exemple utilise le port USB/Sériel de l'Arduino, et envoie des commandes "10\n" (relais 1, off) ou "41\n" (relais 4, on).

Prérequis

sudo apt-get install python-serial

Configuration

LinuxCNC

/home/user/emc2/machine/custom.hal

...
loadusr -Wn serial-relays ./serial-relays.py

net spindle-on     <= motion.spindle-on
#net coolant-mist   <= iocontrol.0.coolant-mist
#net coolant-flood  <= iocontrol.0.coolant-flood

net xenable        => serial-relays.relay1
net spindle-on     => serial-relays.relay2
#net coolant-mist   => serial-relays.relay3
#net coolant-flood  => serial-relays.relay4

Remarques:

  • "xenable" n'a pas besoin d'être défini
  • Une fonction ne peut être définie que pour une seule action. EMC2 créera une erreur si une fonction est déjà attribuée ailleurs.
  • EMC2 doit être redémarré pour prendre en considération les changements. Si le script en Python suivant n'existe pas ou qu'il contient des erreurs, EMC2 affichera une erreur et refusera de démarrer.

/home/user/emc2/machine/serial-relays.py

#!/usr/bin/python
import hal, time, serial
 
h = hal.component("serial-relays")
h.newpin("relay1", hal.HAL_BIT, hal.HAL_IN)
h.newpin("relay2", hal.HAL_BIT, hal.HAL_IN)
h.newpin("relay3", hal.HAL_BIT, hal.HAL_IN)
h.newpin("relay4", hal.HAL_BIT, hal.HAL_IN)
h.ready()
 
ser = serial.Serial('/dev/ttyUSB0', 115200, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=0, rtscts=0)
 
rA = 0
rB = 0
rC = 0
rD = 0
 
def serial_command(r, cmd):
    while ser.inWaiting():
        pass
    ser.write(r)
    if True == cmd:
        ser.write('1')
    else:
        ser.write('0')
    ser.write ('\n')
 
 
try:
    while 1:
        if (rA != h.relay1):
            rA = h.relay1
            serial_command('1', rA)
        if (rB != h.relay2):
            rB = h.relay2
            serial_command('2', rB)
        if (rC != h.relay3):
            rC = h.relay3
            serial_command('3', rC)
        if (rD != h.relay4):
            rD = h.relay4
            serial_command('4', rD)
 
 
except KeyboardInterrupt:
    raise SystemExit

Arduino

/*
Use an Arduino to drive relays from EMC2 HAL
In this example, I'm using a 4-relays card with inverted input. If you drive directly the relays, redefine MYHIGH to HIGH and MYLOW to LOW.
*/
 
#define MYHIGH LOW
#define MYLOW  HIGH
int relay_pin[] = {3, 4, 5, 6};
 
char in[2];
 
void setup () {
  int i = 0;
  while (relay_pin[i]) {
    digitalWrite (relay_pin[i], MYLOW);
    pinMode (relay_pin[i], OUTPUT);
    i++;
  }
  Serial.begin (115200);
}
 
void loop () {
  static int in_pos = 0;
  char c;
  int i;
  while (Serial.available ()) {
    char c = (char) Serial.read ();
    if (c == '\r' || c == '\n') {
      if (in_pos >= 2) {
        i = in[0] - 1;
        if (i >= 0 && i <= 3) {
          digitalWrite (relay_pin[i], (in[1] > 0) ? MYHIGH : MYLOW);
        }
      }
      in_pos = 0;
    } else {
      in[in_pos++] = c - 48;
    }
  }
}

Références

Outils personnels